package com.winz.cultureapp.http.restful;


import com.winz.cultureapp.constants.Constants;
import com.winz.cultureapp.entity.ActivityBookDetailBean;
import com.winz.cultureapp.entity.ActivityCategoryBean;
import com.winz.cultureapp.entity.ActivityDesBean;
import com.winz.cultureapp.entity.ActivityListBean;
import com.winz.cultureapp.entity.AdminBookDetailBean;
import com.winz.cultureapp.entity.AppUpdateBean;
import com.winz.cultureapp.entity.ArtDesBean;
import com.winz.cultureapp.entity.ArtDesListBean;
import com.winz.cultureapp.entity.ArtListBean;
import com.winz.cultureapp.entity.ArtTypeBean;
import com.winz.cultureapp.entity.BookFixBean;
import com.winz.cultureapp.entity.BookStadiumTimeBean;
import com.winz.cultureapp.entity.CodeBean;
import com.winz.cultureapp.entity.CommunityDesBean;
import com.winz.cultureapp.entity.CommunityListBean;
import com.winz.cultureapp.entity.CulturalTypeBean;
import com.winz.cultureapp.entity.CultureDesBean;
import com.winz.cultureapp.entity.ExhibitionListBean;
import com.winz.cultureapp.entity.HomeBannertBean;
import com.winz.cultureapp.entity.LegacyTypeBean;
import com.winz.cultureapp.entity.LocationBean;
import com.winz.cultureapp.entity.LoginUserBean;
import com.winz.cultureapp.entity.LoginUserInfoBean;
import com.winz.cultureapp.entity.MessageListBean;
import com.winz.cultureapp.entity.NewsListBean;
import com.winz.cultureapp.entity.NewsypeBean;
import com.winz.cultureapp.entity.PersonItem1ListBean;
import com.winz.cultureapp.entity.PersonItem2ListBean;
import com.winz.cultureapp.entity.PersonItem4ListBean;
import com.winz.cultureapp.entity.ProjectListBean;
import com.winz.cultureapp.entity.PublicGnBean;
import com.winz.cultureapp.entity.PublicTypeBean;
import com.winz.cultureapp.entity.PublicationListBean;
import com.winz.cultureapp.entity.RecordActivityListBean;
import com.winz.cultureapp.entity.RecordListBean;
import com.winz.cultureapp.entity.SeatListBean;
import com.winz.cultureapp.entity.ShanXuanBean;
import com.winz.cultureapp.entity.ShowVolunteerBean;
import com.winz.cultureapp.entity.StadiumDesBean;
import com.winz.cultureapp.entity.StadiumDesListBean;
import com.winz.cultureapp.entity.StadiumListBean;
import com.winz.cultureapp.entity.StadiumTypeBean;
import com.winz.cultureapp.entity.TypeBean;
import com.winz.cultureapp.entity.UserChangPwdBean;
import com.winz.cultureapp.entity.UserCollectionBean;
import com.winz.cultureapp.entity.UserInfoBean;
import com.winz.cultureapp.entity.UserSendRes;
import com.winz.cultureapp.entity.VolunteerListBean;
import com.winz.cultureapp.entity.VolunteerTypeBean;
import com.winz.cultureapp.entity.request.ActivityBookReq;
import com.winz.cultureapp.entity.request.AdminUserLoginReq;
import com.winz.cultureapp.entity.request.UnitBookFixReq;
import com.winz.cultureapp.entity.request.UserLoginReq;
import com.winz.cultureapp.entity.request.UserRegisterReq;
import com.winz.cultureapp.entity.request.UserSendReq;
import com.winz.cultureapp.http.request.ActivityBookCancleReq;
import com.winz.cultureapp.http.request.AdminBookDetailReq;
import com.winz.cultureapp.http.request.ApplyCommunityReq;
import com.winz.cultureapp.http.request.ChangPwdReq;
import com.winz.cultureapp.http.request.UnitAppointmentReq;
import com.winz.cultureapp.http.request.UnitBookFixCancleReq;
import com.winz.cultureapp.http.request.UserCollectionReq;
import com.winz.cultureapp.http.request.UserInfoReq;

import java.util.HashMap;

import io.reactivex.Observable;
import okhttp3.MultipartBody;
import okhttp3.ResponseBody;
import retrofit2.http.Body;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
import retrofit2.http.Header;
import retrofit2.http.Headers;
import retrofit2.http.POST;
import retrofit2.http.Path;
import retrofit2.http.QueryMap;
import retrofit2.http.Streaming;
import retrofit2.http.Url;

/**
 * Created by admin on 2017/7/28.
 * 后台接口管理
 */

public interface Api {



    @FormUrlEncoded
    @Headers({"Content-Type:application/x-www-form-urlencoded;charset=utf-8","Accept:application/json;charset=utf-8"})
    @POST(Constants.URL.LOGIN)
    Observable<LoginUserInfoBean> login(@Field("android_post_json") String json); // 登录


//    @Multipart
//    @POST(Constants.URL.UPDATE_HEADER + DEBUG)
//    Observable<UpDateHeaderBean> update_header(@PartMap Map<String, RequestBody> map, @Part MultipartBody.Part file); // 上传头像

    @Streaming
    @GET
    Observable<ResponseBody> download(@Url String url);

    // 发验证码
    @POST(Constants.URL.USER_SEND)
    Observable<UserSendRes> user_send(@Body UserSendReq body);
    // 注册
    @POST(Constants.URL.USER_REGISTER)
    Observable<LoginUserBean> user_register(@Body UserRegisterReq body);
    // 登录
    @POST(Constants.URL.USER_LOGIN)
    Observable<LoginUserBean> user_login(@Body UserLoginReq body);
    // 获取用户信息接口
    @GET(Constants.URL.USER_INFO)
    Observable<UserInfoBean> user_info(@Header("token") String token);
    // 修改密码接口
    @GET(Constants.URL.USER_PASSWORD_UPDATE)
    Observable<UserChangPwdBean> user_password_update(@Header("token") String token, @Body ChangPwdReq body);
    // 修改用户信息接口
    @POST(Constants.URL.USER_INFO_UPDATE)
    Observable<UserInfoBean> user_info_update(@Header("token") String token, @Body UserInfoReq body);
    // 加载个人收藏列表
    @GET(Constants.URL.USER_COLLECTION)
    Observable<UserCollectionBean> user_collection(@Header("token") String token,@QueryMap HashMap<String, String> params);
    // 保存个人收藏列表
    @POST(Constants.URL.USER_COLLECTION_SAVE)
    Observable<UserInfoBean> user_collection_save(@Header("token") String token, @Body UserCollectionReq body);
    // 取消个人收藏
    @POST(Constants.URL.USER_COLLECTION_CANCEL)
    Observable<UserInfoBean> user_collection_cancel(@Header("token") String token, @Body UserCollectionReq body);
    // 我的消息列表
    @GET(Constants.URL.USER_MESSAGE)
    Observable<MessageListBean> user_message(@Header("token") String token, @QueryMap HashMap<String, String> params);
    // 用户实名验证
    @POST(Constants.URL.USER_AUTH)
    Observable<BookFixBean> user_auth(@Header("token") String token, @Body MultipartBody multipartBody);
    // 用户实名验证
    @POST(Constants.URL.USER_HEADERIMAGE)
    Observable<BookFixBean> user_headerimage(@Header("token") String token, @Body MultipartBody multipartBody);
    // 新的

    // APP更新
//    @Headers({"Content-Type:application/json;charset=utf-8","Accept:application/json;charset=utf-8"})
    @GET(Constants.URL.APP_UPDATE)
    Observable<AppUpdateBean> app_update(@QueryMap HashMap<String, String> params);
    // 获取轮播图相关列表
    @GET(Constants.URL.HOME_BANNER)
    Observable<HomeBannertBean> homeBanner();

    // 获取文化活动列表
    @GET(Constants.URL.ACTIVITY)
    Observable<ActivityListBean> activity(@QueryMap HashMap<String, String> params);
    // 获取文化活动分类列表
    @GET(Constants.URL.ACTIVITY_CATEGORY)
    Observable<ActivityCategoryBean> activity_category();
    // 加载文体活动的座位分布
    @GET(Constants.URL.ACTIVITY_SEAT)
    Observable<SeatListBean> activity_seat(@Path("id") String id);

    // 获取文化活动详情
    @GET(Constants.URL.ACTIVITY_DETAIL)
    Observable<ActivityDesBean> activity_detail(@Header("token") String token,@Path("id") String id);

    // 保存活动预定信息
    @POST(Constants.URL.ACTIVITY_BOOK)
    Observable<BookFixBean> activity_book(@Header("token") String token,@Body ActivityBookReq body);
    // 活动预定记录
    @GET(Constants.URL.ACTIVITY_BOOK_RECORD)
    Observable<PersonItem2ListBean> activity_book_record(@Header("token") String token, @QueryMap HashMap<String, String> params);

    // 用户文化场馆预约记录
    @GET(Constants.URL.USER_APPOINTMENT)
    Observable<PersonItem4ListBean> user_appointment(@Header("token") String token, @QueryMap HashMap<String, String> params);
    // 取消活动预定
    @POST(Constants.URL.ACTIVITY_BOOK_CANCEL)
    Observable<BookFixBean> activity_book_cancel(@Header("token") String token,@Body ActivityBookCancleReq body);


    // 获取茂名区域列表
    @GET(Constants.URL.AREA_MM)
    Observable<LocationBean> area_mm();

    // 获取全部场馆列表
    @GET(Constants.URL.UNIT_SEARCH)
    Observable<StadiumListBean> unit_search(@QueryMap HashMap<String, String> params);
    // 获取子场馆列表
    @GET(Constants.URL.UNIT_CHILD)
    Observable<StadiumDesListBean> unit_child(@QueryMap HashMap<String, String> params);
    // 获取场馆详情
    @GET(Constants.URL.UNIT_DETAIL)
    Observable<StadiumDesBean> unit_detail(@Path("id") String id);
    // 获取茂名区域列表
    @GET(Constants.URL.UNIT_CATEGORY)
    Observable<StadiumTypeBean> unit_category();
    // 获取全部功能分类列表
    @GET(Constants.URL.UNIT_FUNCTION_CATEGORY)
    Observable<PublicGnBean> unit_function_category();
    // 根据条件筛选场馆预定时间表
    @GET(Constants.URL.UNIT_BOOK_SCHEDULE)
    Observable<BookStadiumTimeBean> unit_book_schedule(@QueryMap HashMap<String, String> params);
    // 保存固定场馆预定信息
    @POST(Constants.URL.UNIT_BOOK_FIX)
    Observable<BookFixBean> unit_book_fix(@Header("token") String token,@Body UnitBookFixReq body);
    // 保存非固定场馆预定信息
    @POST(Constants.URL.UNIT_BOOK_UNFIX)
    Observable<BookFixBean> unit_book_unfix(@Header("token") String token,@Body MultipartBody multipartBody);

    // 取消固定场馆预定
    @POST(Constants.URL.UNIT_BOOK_FIX_CANCEL)
    Observable<BookFixBean> unit_book_fix_cancel(@Header("token") String token,@Body UnitBookFixCancleReq body);

    // 取消固定场馆预定
    @POST(Constants.URL.UNIT_APPOINTMENT)
    Observable<BookFixBean> unit_appointment(@Header("token") String token,@Body UnitAppointmentReq body);

    // 管理员登录接口
    @POST(Constants.URL.ADMIN_USER_LOGIN)
    Observable<LoginUserBean> admin_user_login(@Body AdminUserLoginReq body);
    // 管理员登录接口
    @POST(Constants.URL.ADMIN_USER_UNIT_BOOK_DETAIL)
    Observable<AdminBookDetailBean> admin_user_unit_book_detail(@Header("token") String token,@Body AdminBookDetailReq body);
    // 管理员验证固定场馆预订使用
    @POST(Constants.URL.ADMIN_USER_UNIT_BOOK_VERIFY)
    Observable<AdminBookDetailBean> admin_user_unit_book_verify(@Header("token") String token,@Body AdminBookDetailReq body);
     // 管理员验证固定场馆预订使用
    @GET(Constants.URL.ADMIN_USER_UNIT_BOOK_LIST)
    Observable<RecordListBean> admin_user_unit_book_list(@Header("token") String token, @QueryMap HashMap<String, String> params);

    // 管理员查看活动预订详情
    @POST(Constants.URL.ADMIN_USER_ACTIVITY_BOOK_DETAIL)
    Observable<ActivityBookDetailBean> admin_user_activity_book_detail(@Header("token") String token, @Body AdminBookDetailReq body);
    // 管理员验证活动预订使用
    @POST(Constants.URL.ADMIN_USER_ACTIVTY_BOOK_VERIFY)
    Observable<AdminBookDetailBean> admin_user_activity_book_verify(@Header("token") String token,@Body AdminBookDetailReq body);
    // 管理员验证过的活动预订列表
    @GET(Constants.URL.ADMIN_USER_ACTIVITY_BOOK_LIST)
    Observable<RecordActivityListBean> admin_user_activity_book_list(@Header("token") String token, @QueryMap HashMap<String, String> params);

    // 固定场馆预定记录
    @GET(Constants.URL.UNIT_BOOK_FIX_RECORD)
    Observable<PersonItem1ListBean> unit_book_fix_record(@Header("token") String token, @QueryMap HashMap<String, String> params);

    // 获取所有文化社团的列表列表
    @GET(Constants.URL.LEAGUE)
    Observable<CommunityListBean> league(@QueryMap HashMap<String, String> params);
    // 获取我加入的社团列表
    @GET(Constants.URL.LEAGUE_MY)
    Observable<CommunityListBean> league_my(@Header("token") String token,@QueryMap HashMap<String, String> params);

    // 获取社团详情
    @GET(Constants.URL.LEAGUE_DETAIL)
    Observable<CommunityDesBean> league_detail(@Header("token") String token,@Path("id") String id);

    // 申请加入社团
    @POST(Constants.URL.LEAGUE_APPLY)
    Observable<CommunityDesBean> league_apply(@Header("token") String token,@Body ApplyCommunityReq body);


    // 获取所有文化社团的分类列表
    @GET(Constants.URL.LEAGUE_CATEGORY)
    Observable<TypeBean> league_category();

    // 新闻公告列表
    @GET(Constants.URL.NEWS_SEARCH)
    Observable<NewsListBean> news_search(@QueryMap HashMap<String, String> params);
    // 资讯分类列表
    @GET(Constants.URL.NEWS_CATEGORY)
    Observable<NewsypeBean> news_category();

    // 获取全部志愿活动列表
    @GET(Constants.URL.VOLUNTEER_ACTIVITY)
    Observable<VolunteerListBean> volunteer_activity(@QueryMap HashMap<String, String> params);
    // 获取文化志愿内容分类列表
    @GET(Constants.URL.VOLUNTEER_CATEGORY)
    Observable<VolunteerTypeBean> volunteer_category();
    // 获取文化志愿内容分类列表
    @GET(Constants.URL.ACTIVITY_UNIT)
    Observable<StadiumDesListBean> activity_unit();
    // 获取文化志愿服务中的新闻资讯列表
    @GET(Constants.URL.VOLUNTEER_NEWS)
    Observable<NewsListBean> volunteer_news(@QueryMap HashMap<String, String> params);
    // 获取分类获取内容列表
    @GET(Constants.URL.VOLUNTEER)
    Observable<ShowVolunteerBean> volunteer(@QueryMap HashMap<String, String> params);


    // 获取所有文化非遗类别列表
    @GET(Constants.URL.LEGACY_CATEGORY)
    Observable<LegacyTypeBean> legacy_category();

    // 获取全部场馆列表
    @GET(Constants.URL.LEGACY)
    Observable<ProjectListBean> legacy(@QueryMap HashMap<String, String> params);

    // 获取文化非遗研究成果与多媒体出版物分类列表
    @GET(Constants.URL.LEGACY_RESEARCH_CATEGORY)
    Observable<PublicTypeBean> legacy_research_category();


    // 文化非遗研究成果与多媒体出版物内容列表
    @GET(Constants.URL.LEGACY_RESEARCH)
    Observable<PublicationListBean> legacy_research(@QueryMap HashMap<String, String> params);

    // 获取文化活动列表
    @GET(Constants.URL.ART)
    Observable<ProjectListBean> art(@QueryMap HashMap<String, String> params);

    // 获取文化活动列表
    @GET(Constants.URL.ART_CHILD)
    Observable<ArtDesListBean> art_child(@QueryMap HashMap<String, String> params);

    // 获取文化活动列表
    @GET(Constants.URL.ART_DETAIL)
    Observable<ArtDesBean> art_detail(@Path("id") String id);

    // 获取文物鉴赏分类列表
    @GET(Constants.URL.CULTURAL_CATEGORY)
    Observable<CulturalTypeBean> cultural_category();
    // 获取所有文物鉴赏列表
    @GET(Constants.URL.CULTURAL)
    Observable<ArtListBean> cultural(@QueryMap HashMap<String, String> params);

    // 获取所有文物鉴赏列表
    @GET(Constants.URL.CULTURAL_DETAIL)
    Observable<CultureDesBean> cultural_detail(@Path("id") String id);

    // 获取文化活动列表
    @GET(Constants.URL.UNIT_CULTURE)
    Observable<ExhibitionListBean> unit_culture(@QueryMap HashMap<String, String> params);
    // 获取文化场馆分类列表
    @GET(Constants.URL.UNIT_CULTURE_CATEGORY)
    Observable<ShanXuanBean> unit_culture_category();

    // 获取艺术鉴赏分类列表,分类列表只针对父类内容
    @GET(Constants.URL.ART_CATEGORY)
    Observable<ArtTypeBean> art_category();

    // 二维码
    @GET(Constants.URL.APP_UPATE_NEW)
    Observable<CodeBean> app_upate_new();
}
